######################################## Vim 文本对象:终极指导 ######################################## .. admonition:: 声明 本文译自 https://blog.carbonfive.com/vim-text-objects-the-definitive-guide/ 要Text Objects在 Vim 有效地编辑,你不应当按字符编辑,而应当是按词、按句、按段。在 Vim 中,这三种高级上下文被称为 :abbr:`文本对象 (Text Objects)`。Vim 为纯文本和代码都提供了文本对象。你也可以在 Vim 脚本中定义新的文本对象。学习文本对象可以使你编辑的速度和精确度都得到提升 编辑命令的结构 **************************************** 在 Vim 中,编辑命令具有以下结构 :: <数字><命令><文本对象或 motion> - 数字代表在多少个文本对象或 motion 上执行操作,例如删除三个词或两个段落。数字是可选的,而且可以出现在命令的后面 - 命令是一个操作。例如 Change, Delete, Copy。命令也是可选的,但是没它的时候你只是执行了 motion 来移动光标,而没有执行编辑操作 - 文本对象可以是一个文字结构,例如一个词或者一个段落。motion 可以是前进一行、后退一段、进入行尾 一个编辑命令是由一个命令加上一个文本对象或 motion,例如删除这个词、更改下一段、复制这一段。 .. admonition:: 译者注 实际上,可以接文本对象的命令一共有七个:cvdy=>< 纯文本文本对象 **************************************** Vim 为纯文本提供了三种文本对象: :abbr:`词 (Words)` 、句子和段落 词 ======================================== - aw - a word(包括周围的空格) - iw - inner word (不包含周围的空格) :: Lorem ipsum dolor sit amet... **daw** :: Lorem dolor sit amet... 以 a 开头的文本对象包含周围的空格。motion w 也许被认为和文本对象 aw 相似,但是不同的是 dw 或删除词剩余部分,而 daw 或删除整个词,而不论光标在词的任何位置上 句子 ======================================== - as - a sentence - is - inner sentence 段落 ======================================== - ap - a paragraph - ip - inner paragraph Motion 命令 vs. 文本对象命令 **************************************** 编程语言文本对象 **************************************** Vim 基于公共编程结构提供了几种文本对象 字符串 ======================================== - a" - a 双引号括起的字符串 - i" - inner 双引号括起的字符串 - a' - a 单引号括起的字符串 - i' - inner 单引号括起的字符串 - a` - a 反引号括起的字符串 - i` - inner 反引号括起的字符串 括号 ======================================== - a) - a 圆括号括起的字符串 - i) - inner 圆括号括起的字符串 中括号 ======================================== - a] - a 中括号括起的字符串 - i] - inner 中括号括起的字符串 大括号 ======================================== - a} - a 大括号括起的字符串 - i} - inner 大括号括起的字符串 标记语言标签 ======================================== - at - a 标签括起的字符串 - it - inner 标签括起的字符串 Vim 脚本提供的额外文本对象 **************************************** CamelCaseMotion_ 提供的文本对象可供在驼峰命名的单词中进行移动 VimTextObj_ 提供的文本对象可用于函数参数 `Indent Object`_ 基于缩进提供了文本对象 `Ruby Block`_ 提供了基于 Ruby block 的文本对象 .. _CamelCaseMotion: https://github.com/bkad/CamelCaseMotion .. _VimTextObj: https://github.com/vim-scripts/argtextobj.vim .. _`Indent Object`: https://github.com/michaeljsmith/vim-indent-object .. _`Ruby Block`: https://github.com/nelstrom/vim-textobj-rubyblock